package com.pzj.export;

import java.io.Closeable;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

import com.pzj.export.config.ExportConfiguration;
import com.pzj.export.config.TableConfig;
import com.pzj.export.exception.ExportException;

/**
 * 导出接口
 * @author Puzhijun
 * @param <T>
 */
public interface Export<T> extends Closeable {

	/**
	 * 导出Excel文件流
	 * <p><b>注意</b>
	 * 		如果是有设置exportConfiguration对象，
	 * 		并且设置isSeparateExcel为true，
	 * 		那么最后导出的是个excel的zip压缩包，并且传递到方法中的
	 * 	   <pre>list</pre>对象执行完成后会被清空数据，并被置为null
	 * </p>
	 * @param list 包含需导出数据的对象list。
	 * @param tableConfig 导出表格配置。
	 * @param out 输出流。
	 * @return 成功返回导出条数，失败返回-1。
	 */
	int exportExcel(List<T> list, TableConfig<T> tableConfig, OutputStream out);
	
	/**
	 * 导出Excel文件流
	 * <p><b>注意</b>
	 * 		如果是有设置exportConfiguration对象，
	 * 		并且设置isSeparateExcel为true，
	 * 		那么最后导出的是个excel的zip压缩包，并且传递到方法中的
	 * 	   <pre>list</pre>对象执行完成后会被清空数据，并被置为null
	 * </p>
	 * @param list 包含需导出数据的对象list。
	 * @param tableConfig 导出表格配置。
	 * @param in 输入流。 当in不为null时，根据输入的excel文件基础上创建输出表格。
	 * @param out 输出流。
	 * @return 成功返回导出条数，失败返回-1。
	 */
	int exportExcel(List<T> list, TableConfig<T> tableConfig, InputStream in, OutputStream out);
	
	/**
	 * 可以利用当前实例进行多次导出，最后必须调用<pre>close()</pre>方法，显示进行关闭
	 * @param list 需要导出的数据
	 * @param tableConfig 导出配置
	 * @return 返回正确导出数据的条数
	 * @throws ExportException 导出过程中船舷异常
	 * @throws IllegalArgumentException 导出数据为空时
	 * @throws IllegalArgumentException tableConfig为空时
	 * @throws IllegalArgumentException column config为空时
	 */
	int multiExport(List<T> list, TableConfig<T> tableConfig) throws ExportException;
	
//	/**
//	 * 关闭并且导出
//	 * 导出的是个zip压缩格式的包
//	 * @param out 输出流
//	 * @throws ExportException 关闭导出的时候出现异常
//	 */
//	void closeAndExport(OutputStream out) throws ExportException;
	
	/**
	 * 导出成zip文件
	 * @param out 输入流
	 * @throws ExportException 导出时候出现异常
	 */
	void exportToZipFile(OutputStream out) throws ExportException;
	
	/**
	 * 获取导出excel配置
	 * */
	ExportConfiguration getExportConfiguration();
	
	/**
	 * 设置excel导出配置
	 * */
	void setExportConfiguration(ExportConfiguration exportConfiguration);
	
	/**
	 * 一行数据的提供者
	* @Title: getExportRowDataHolder
	* @Description: 一行数据的提供者
	 */
	ExportRowDataHolder getExportRowDataHolder();

	/**
	 * 一行数据的提供者
	* @Title: setExportRowDataHolder
	* @Description: 一行数据的提供者
	 */
	void setExportRowDataHolder(ExportRowDataHolder exportRowDataHolder);
	
	/** 设置sheetname,已经过时,
	 * 请使用{@link com.adtech.export.config.ExportConfiguration.setExcelSheetName} */
	@Deprecated
	void setSheetName(String sheetName);

}